Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

193
Visualizações
Desplazamiento a la derecha sin firmar >>> en Javascript (GraalJS) vs Java

Tengo el siguiente código Java:

 long num = 3482085570325547757; // Discard all but the highest priority 31 bits int result = (int) (num >>> 33); // Returns 405368112

Estoy tratando de hacer el equivalente en Javascript (usando el motor https://github.com/oracle/graaljs ), sin embargo, no me está dando el mismo resultado que el código Java:

 const num = 3482085570325547757; // Discard all but the highest priority 31 bits const result = num >>> 33; // Returns 1281508608

Pensé que podría tener que ver con la forma en que GraalJS almacena números internamente como enteros y dobles. También intenté transmitir explícitamente a int usando lo siguiente, pero también me dio un resultado diferente al código Java:

 const Long = Java.type('java.lang.Long'); const String = Java.type('java.lang.String'); const BigInteger = Java.type('java.math.BigInteger'); const num = 3482085570325547757; // Discard all but the highest priority 31 bits const result = BigInteger.valueOf(num >>> 33).intValue(); // Returns 1281508608
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

En primer lugar, su ejemplo de Java no se compila. Los literales largos requieren un sufijo L (o l ):

 long num = 3482085570325547757L;

Entonces, JavaScript no puede almacenar ese número con total precisión.

 const num = 3482085570325547757; console.log(num); // Displays 3482085570325547500

El entero máximo que puede almacenar es 9007199254740991 ( Number.MAX_SAFE_INTEGER ).

Usar BigInteger de Java como lo hizo así no funcionará, porque ya ha perdido precisión antes de crear BigInteger . Necesitaría usar una cadena para crear correctamente BigInteger (o BitInt de JavaScript, o el sufijo n ).

Sin embargo, eso tampoco es realmente útil, porque >>> no tiene sentido en ellos. Cita de la documentación de BigInteger de Java:

El operador de desplazamiento a la derecha sin signo (>>>) se omite ya que esta operación solo tiene sentido para una palabra de tamaño fijo y no para una representación que tiene conceptualmente un número infinito de bits de signo virtuales principales.

Lo mismo es cierto para BigInt de JavaScript.

Sin embargo, puede usar el operador normal de desplazamiento a la derecha ( >> ) con BigInt :

 const num = BigInt("3482085570325547757"); const bigIntResult = num >> BigInt(33); const result = Number(bigIntResult); // Convert to normal number

O

 const num = 3482085570325547757n; const bigIntResult = num >> 33n; const result = Number(bigIntResult); // Convert to normal number

O el método shiftRight() de BigInteger de Java (no probado, porque no tengo la configuración de GraalJS):

 const BigInteger = Java.type('java.math.BigInteger'); const num = new BigInteger("3482085570325547757"); const result = num.shiftRight(33).intValue();

Ver también:

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
  • https://tc39.es/ecma262/#sec-ecmascript-language-types-number-type
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda